#ifndef __CHRONOMETRE_H
#define __CHRONOMETRE_H

#include "weather_report.h"
#include "commun/moyenneur.h"
#include <string>

class carbone_14;

/**
 * Classe RAII permettant de faire une opération définie par le foncteur Jaco
 * sur le temps écoulé entre la construction et la destruction de l'objet.
 * C'est un chronomètre d'athlétisme, précédemment nommé weather_report, en
 * hommage au grand groupe Weather Report (et à son bassiste le grand Jaco).
 */
template <class Jaco = carbone_14>
struct chronometre {
	typedef temps::type_temps type_temps;
    chronometre(Jaco j = Jaco()) : j_(j) { initial_ = temps::maintenant(); }
    static type_temps maintenant() { return temps::maintenant(); }
    ~chronometre() { j_(maintenant() - initial_); }
	Jaco operator()() { return j_; }
private:
    type_temps initial_;
    Jaco j_;
};

/**
 * Foncteur prédéfini pour conserver le temps d'une tâche.
 */
class carbone_14 {
	temps::type_temps tps_;
public:
	carbone_14() : tps_(0) {}
	void operator()(temps::type_temps t) { tps_ = t; }
	operator temps::type_temps() { return tps_; }
};

typedef moyenneur<temps::type_temps> moyenneur_temps;

/**
 * Foncteur prédéfini pour annoter le temps d'une tâche sur la sortie standard.
 */
class scribe {
	std::string titre_travail_;
public:
	scribe(std::string titre_travail) throw();
	void operator()(temps::type_temps temps_total);
};

#endif
